﻿#include<iostream>
#include<vector>
#include<list>
using namespace std;

//class Person
//{
//public:
//	// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证 
//	void identity()
//	{
//		cout << "void identity()" << _name << endl;
//	}
//protected:
//	string _name = "张三"; // 姓名 
//	string _address; // 地址 
//	string _tel; // 电话 
//	int _age = 18; // 年龄 
//};
//
//class Student : public Person//{
//public:
//	// 学习 
//	void study()
//	{
//		// ...
//	}
//protected:
//	int _stuid; // 学号 
//};
//
//class Teacher : public Person
//{
//public:
//	// 授课 
//	void teaching()
//	{
//		//...
//	}
//protected:
//	string title; // 职称 
//};
//
////int main()
////{
////	Student s;
////	Teacher t;
////	s.identity();
////	t.identity();
////	return 0;
////}////////////类模板////#define CONTAINER std::vector
//#define CONTAINER std::list
////#define CONTAINER std::deque
//////namespace bit
//{
//	//template<class T>
//	//class vector
//	//{};
//	// stack和vector的关系，既符合适配器，也符合继承
//	template<class T>
//	class stack : public CONTAINER<T>
//	{
//	public:
//		void push(const T& x)
//		{
//			// 基类是类模板时，需要指定⼀下类域， 
//			// 否则编译报错:error C3861: “push_back”: 找不到标识符 //		   // 因为stack<int>实例化时，也实例化vector<int>了 
// // 但是模版是按需实例化，push_back等成员函数未实例化，所以找不到 
//			CONTAINER<T>::push_back(x);
//			//push_back(x);
//		}
//		void pop()
//		{
//			CONTAINER<T>::pop_back();
//		}
//		const T& top()
//		{
//			return CONTAINER<T>::back();
//		}
//		bool empty()
//		{
//			return CONTAINER<T>::empty();
//		}
//	};
//}
//
////int main()
////{
////	bit::stack<int> st;
////	st.push(1);
////	st.push(2);
////	st.push(3);
////	while (!st.empty())
////	{
////		cout << st.top() << " ";
////		st.pop();
////	}
////	return 0;
////}//////基类和派生类之间的赋值兼容转换////class Person
//{
////protected:
//	virtual void func()
//	{}
//public:
//	string _name; // 姓名
//	string _sex; // 性别
//	int _age; // 年龄
//};
//
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//
//int main()
//{
//	Student sobj;
//
//	// 1.子类对象可以赋值给父类对象/指针/引用
//	Person pobj = sobj;
//	Person* pp = &sobj;
//	Person& rp = sobj;
//	
//	//2.父类对象不能赋值给子类对象，这里会编译报错
//	//sobj = (Student)pobj;
//
//	return 0;
//}
//
////子类的默认成员函数
//
////class Student : public Person
////{
////public:
////	// 默认生成的构造函数的行为
////	// 1、内置类型->不确定
////	// 2、自定义类型->调用默认构造
////	// 3、继承父类成员看做一个整体对象，要求调用父类的默认构造
////protected:
////	int _num = 1; //学号
////	string _addrss = "西安市高新区";
////};
////
////int main()
////{
////	Student s;
////
////	return 0;
////}
//
//
//// 前置声明
////class Student;
////
////class Person
////{
////public:
////	// 友元关系不能被继承
////	friend void Display(const Person& p, const Student& s);
////protected:
////	string _name; // 姓名
////};
////
////class Student : public Person
////{
////	friend void Display(const Person& p, const Student& s);
////protected:
////	int _stuNum; // 学号
////};
////
////void Display(const Person& p, const Student& s)
////{
////	cout << p._name << endl;
////	cout << s._stuNum << endl;
////}
////
////int main()
////{
////	Person p;
////	Student s;
////	// 编译报错：error C2248: “Student::_stuNum”: 无法访问 protected 成员
////	// 解决方案：Display也变成Student 的友元即可
////	Display(p, s);
////
////	return 0;
////}
//
//
//
//class Person
//{
//public:
//	Person(const char* name)
//		:_name(name)
//	{}
//
//	string _name; // 姓名
//	/*int _tel;
//	int _age;
//	string _gender;
//	string _address;*/
//	// ...
//};
//
//class Student : virtual public Person
//{
//public:
//	Student(const char* name, int num = 0)
//		:Person(name)
//		,_num(num)
//	{}
//protected:
//	int _num; //学号
//};
//
//class Teacher : virtual public Person
//{
//public:
//	Teacher(const char* name, int id = 1)
//		:Person(name)
//		, _id(id)
//	{}
//protected:
//	int _id; // 职工编号
//};
//
//// 不要去玩菱形继承
//class Assistant : public Student, public Teacher
//{
//public:
//	Assistant(const char* name1, const char* name2, const char* name3)
//		:Student(name1)
//		,Teacher(name2)
//		,Person(name3)
//	{}
//protected:
//	string _majorCourse; // 主修课程
//};
//
//int main()
//{
//	// 编译报错：error C2385: 对“_name”的访问不明确
//	//Assistant a;
//	//a._name = "peter";
//
//	//// 需要显示指定访问哪个父类的成员可以解决二义性问题，但是数据冗余问题无法解决
//	//a.Student::_name = "小李";
//	//a.Teacher::_name = "老李";
//
//	//cout << sizeof(a) << endl;
//
//	//Student s;
//
//	Assistant a("张三", "李四", "王五");
//
//
//	return 0;
//}
//
////虚继承（virtual)
//
//class Person
//{
//public:
//	string _name; // 姓名 
//	/*int _tel;//	int _age;
// string _gender;
// string _address;*/
// // ...
//};
//// 使⽤虚继承Person类 
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号 
//};
//// 使⽤虚继承Person类 
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职⼯编号 
//};
//// 教授助理 
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程 
//};
//int main()
//{
//	// 使⽤虚继承，可以解决数据冗余和⼆义性 
//	Assistant a;
//	a._name = "peter";
//	return 0;
//}


class Person
{
public:
	string _name;
	static int _count;
};
int Person::_count = 0;
class Student : public Person
{
protected:
	int _stuNum;
};
int main()
{
	Person p;
	Student s;	// 公有的情况下，⽗派⽣类指定类域都可以访问静态成员 
	cout << Person::_count << endl;	cout << Student::_count << endl;
	return 0;
}